﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Insifo.BE;
using Insifo.BE.Gen;
using Insifo.DL;
using Insifo.DL.Gen;
using Insifo.BL.Gen;

namespace Insifo.BL.Gen
{
    public class BLPersona 
    {
        DLPersona _dl = new DLPersona();

        //Objeto transaccion
        DLTransactionMng _transaccion = null;

        //Instancias
        DLPersona _dlPersona = new DLPersona();
        DLDireccion _DLDireccion = new DLDireccion();


        /// <summary>
        /// Método obtiene las Personas 
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public DataSet Listar(BEPersona pbe)
        {
            return _dlPersona.Listar(pbe);
        }
        /// <summary>
        /// Listar las personas para el DATATABLE
        /// </summary>
        /// <param name="pbe"></param>
        /// <returns></returns>
        public DataSet ListarTabla(BEPersona pbe)
        {
            return _dlPersona.ListarTabla(pbe);
        }

        /// <summary>
        /// Método obtiene las Personas 
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public DataSet ListarPorTipo(BEPersona pbe)
        {
            return _dlPersona.ListarPorTipo(pbe);
        }

        /// <summary>
        /// Método que obtiene un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPersona Obtener_Mant(BEPersona pbe)
        {
            //return _dl.Obtener(pbe);

            BEPersona beRe = new BEPersona();
            beRe = _dlPersona.Obtener(pbe);

            //Obtiene los Conceptos
            BEDireccion beDireccion = new BEDireccion();
            beDireccion.IdPersona = pbe.IdPersona;
            //beParametroDetalle.ParametroDetalle = pbe.ParametroDetalle;

            return beRe;
        }

        public BEPersona Obtener(BEPersona pbe)
        {
            return _dl.Obtener(pbe);
        }


        /// <summary>
        /// Método que inserta un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPersona Insertar(BEPersona pbe)
        {
            //return _dl.Insertar(pbe);
            BEPersona beRe = new BEPersona();
            _transaccion = DLTransactionMng.Begin();
            try
            {
                _dlPersona.Transaction = _transaccion;
                _DLDireccion.Transaction = _transaccion;

                //Valores definidos
                beRe.Codigo = "";
                                
                beRe = _dlPersona.Insertar(pbe);
                //Insertar el Detalle
                if (pbe.Direccion != null)
                {
                    foreach (BEDireccion be in pbe.Direccion)
                    {
                        be.IdPersona = beRe.IdPersona;
                        //be.ParametroDetalle = beRe.ParametroDetalle;
                        _DLDireccion.Insertar(be);
                    }
                }

                if (beRe.TransaccionSpring == "S")
                {
                    //Insertar Spring - PersonaMast 
                    pbe.IdPersona = beRe.IdPersona;
                    _dlPersona.InsertarSpring(pbe);
                    _dlPersona.ActualizarUnidadReplicacionSpring(pbe);
                }                
                //Termina transacción
                _transaccion.Commit();
            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return beRe;
        }

        /// <summary>
        /// Método que actualiza un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPersona Actualizar(BEPersona pbe)
        {
            //return _dl.Actualizar(pbe);
            BEPersona bePersona = new BEPersona();
            _transaccion = DLTransactionMng.Begin();
            try
            {
                _dlPersona.Transaction = _transaccion;
                _DLDireccion.Transaction = _transaccion;
                //Valores definidos
                bePersona.Codigo = "";
                //Obtener Informacion completa.
                bePersona = Obtener(pbe);

                //Actualizar los campos que obtiene del Formulario.
                bePersona.EsCliente = pbe.EsCliente;
                bePersona.EsEmpleado = pbe.EsEmpleado;
                bePersona.EsProveedor = pbe.EsProveedor;
                bePersona.EsOtro = pbe.EsOtro;
                bePersona.CodigoPersona = pbe.CodigoPersona;
                bePersona.CodigoBarras = pbe.CodigoBarras;
                bePersona.ApellidoPaterno = pbe.ApellidoPaterno;
                bePersona.ApellidoMaterno = pbe.ApellidoMaterno;
                bePersona.Nombres = pbe.Nombres;
                bePersona.NombreCompleto = pbe.NombreCompleto;
                bePersona.NombreBusqueda = pbe.NombreBusqueda;
                bePersona.FechaNacimiento = pbe.FechaNacimiento;
                bePersona.Nacionalidad = pbe.Nacionalidad;
                bePersona.Sexo = pbe.Sexo;
                bePersona.EstadoCivil = pbe.EstadoCivil;
                bePersona.ClasePersona = pbe.ClasePersona;
                bePersona.IdGrupo = pbe.IdGrupo;
                bePersona.Telefono1 = pbe.Telefono1;
                bePersona.Telefono2 = pbe.Telefono2;
                bePersona.Telefono3 = pbe.Telefono3;
                bePersona.Celular1 = pbe.Celular1;
                bePersona.Celular2 = pbe.Celular2;
                bePersona.Celular3 = pbe.Celular3;
                bePersona.Fax = pbe.Fax;
                bePersona.CorreoElectronico = pbe.CorreoElectronico;
                bePersona.TipoDocumento = pbe.TipoDocumento;
                bePersona.Documento = pbe.Documento;
                bePersona.DocumentoFiscal = pbe.DocumentoFiscal;
                bePersona.Estado = pbe.Estado;

                bePersona = _dlPersona.Actualizar(bePersona);

                //Actualiza el Detalle
                if (pbe.Direccion != null)
                {
                    foreach (BEDireccion be in pbe.Direccion)
                    {
                        be.IdPersona = pbe.IdPersona;
                        //be.ParametroDetalle = pbe.ParametroDetalle;
                        _DLDireccion.Modificar(be);
                    }
                }

                if (bePersona.TransaccionSpring == "S")
                {
                    //Actualizar Spring PersonaMast
                    pbe.IdPersona = bePersona.IdSpring;
                    _dlPersona.ActualizarSpring(bePersona);
                }
                //Culmina la transaccion
                _transaccion.Commit();

            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return bePersona;
        }

        /// <summary>
        /// Método que elimina logicamente un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPersona Eliminar(BEPersona pbe)
        {
            //return _dl.Eliminar(pbe);
            BEPersona bePersona = new BEPersona();
            _transaccion = DLTransactionMng.Begin();
            try
            {
                _dlPersona.Transaction = _transaccion;
                _DLDireccion.Transaction = _transaccion;
                
                bePersona = _dlPersona.Eliminar(pbe);

                if (bePersona.TransaccionSpring == "S")
                {
                    //>Eliminar en Spring.
                    pbe.IdPersona = pbe.IdSpring;
                    _dlPersona.EliminarSpring(pbe);
                }

                //Culmina la transaccion.
                _transaccion.Commit();

            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return bePersona;
        }

    }
}
